﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DAL.Model;
using DAL.Persistence;
using System.Data.SqlClient;
using System.Data;

namespace DAL.Persistence
{
    /// <summary>
    /// Classe responsável pelas transações dos Pedidos no banco de dados
    /// </summary>
    public class PedidoDAL : DAL
    {
        /// <summary>
        /// Método para cadastrar um pedido no banco
        /// </summary>
        /// <param name="p">O pedido a ser cadastrado</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Salvar(Pedido p)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("CadastrarPedido", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@DtPedido", p.DtPedido);
                comando.Parameters.AddWithValue("@DtEntrega", p.DtEntrega);
                comando.Parameters.AddWithValue("@Frete", p.Frete);
                comando.Parameters.AddWithValue("@Total", p.Total);
                comando.Parameters.AddWithValue("@FkUsuario", p.FkUsuario);
                comando.Parameters.AddWithValue("@FkEndereco", p.FkEndereco);

                if (comando.ExecuteNonQuery() > 0)
                    return "Pedido incluído com sucesso";
                else
                    throw new Exception("Erro ao incluir pedido");
            }
            catch (SqlException ex)
            {
                return ex.Message;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Lista todos os pedidos do banco de dados
        /// </summary>
        /// <returns>Retorna uma lista de objetos pedido</returns>
        public List<Pedido> Listar()
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ConsultarPedido", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Dispara a Consulta e armazena no DataReader

                List<Pedido> listaDePedidos = new List<Pedido>();

                //percorrer o DataReader
                while (dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    Pedido p = new Pedido();

                    //Ler os campos do banco para dentro do objeto Pedido
                    p.IdPedido = Convert.ToInt32(dr["CODIGO"]);
                    p.DtPedido = Convert.ToDateTime(dr["DTPEDIDO"]);
                    p.DtEntrega = Convert.ToDateTime(dr["DTENTREGA"]);
                    p.Frete = Convert.ToDecimal(dr["FRETE"]);
                    p.Total = Convert.ToDecimal(dr["TOTAL"]);
                    p.FkUsuario = Convert.ToInt32(dr["FKCLIENTE"]);
                    p.FkEndereco = Convert.ToInt32(dr["FKENDERECO"]);

                    listaDePedidos.Add(p);
                }

                return listaDePedidos;
            }
            catch
            {
                return null;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Retorna um pedido do banco de dados baseado na ID
        /// </summary>
        /// <param name="IdPedido">O ID do pedido</param>
        /// <returns>O pedido</returns>
        public Pedido ConsultaPedidoPorID(int IdPedido)
        {
            try
            {
                comando = new SqlCommand("ConsultarPedidoPorID", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Disparo a Consulta e armazeno no DataReader               

                Pedido p = null;
                //percorrer o DataReader
                while (dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    p = new Pedido();

                    //Ler os campos do banco para dentro do objeto Pedido
                    p.IdPedido = Convert.ToInt32(dr["CODIGO"]);
                    p.DtPedido = Convert.ToDateTime(dr["DTPEDIDO"]);
                    p.DtEntrega = Convert.ToDateTime(dr["DTENTREGA"]);
                    p.Frete = Convert.ToDecimal(dr["FRETE"]);
                    p.Total = Convert.ToDecimal(dr["TOTAL"]);
                    p.FkUsuario = Convert.ToInt32(dr["FKCLIENTE"]);
                    p.FkEndereco = Convert.ToInt32(dr["FKENDERECO"]);
                }

                return p;

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Atualiza um pedido do banco de dados
        /// </summary>
        /// <param name="p">O pedido a ser alterado</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Atualizar(Pedido p)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("AtualizarPedido", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdPedido", p.IdPedido);
                comando.Parameters.AddWithValue("@DtPedido", p.DtPedido);
                comando.Parameters.AddWithValue("@DtEntrega", p.DtEntrega);
                comando.Parameters.AddWithValue("@Frete", p.Frete);
                comando.Parameters.AddWithValue("@Total", p.Total);
                comando.Parameters.AddWithValue("@IdCliente", p.FkUsuario);
                comando.Parameters.AddWithValue("@IdEndereco", p.FkEndereco);

                if (comando.ExecuteNonQuery() > 0)
                    return "Pedido atualizado com sucesso";
                else
                    throw new Exception("Erro. Pedido nao localizado");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Exclui o pedido do banco, usando o ID
        /// </summary>
        /// <param name="IdPedido">O ID do pedido a ser excluido</param>
        /// <returns>Uma mensagem com o status da operação</returns>
        public string Excluir(int IdPedido)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ExcluirPedido", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdPedido", IdPedido);

                if (comando.ExecuteNonQuery() > 0)
                    return "Pedido excluído com sucesso";
                else
                    throw new Exception("Erro. Pedido nao localizado");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }
    }
}